/**
 * 
 */
package com.jiang.utils;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;

/**
 * @author Administrator @ vo 自动封装工具类
 */
public class BeanOperatorUtils {


	/**
	 * @给对象属性赋值(做全套，即传来的值是member.mid或者admin.member.mid) @param attribute
	 * @param value
	 * @param obj
	 */
	public static void setValues(String attribute, String value, Object obj) {
		// 获取赋值参数的类型
		try {
			// 支持单级 member.mid = 30
			// 这里要支持多级判断admin.member.mid
			String[] params = attribute.split("\\.");
			String lastAttr = "";
			// 注意这里要求前端传来的参数至少是xx.属性，如果只有单个值就不会自动赋值
			if (params.length > 2) {
				for (int i = 1; i < params.length-1; i++) {
					// 获取当前对象中的属性对象
					Method method = obj.getClass().getDeclaredMethod("get" + MyStringUtils.initCap(params[i]));
					Object attr_vo = method.invoke(obj);
					if (attr_vo == null) {
						// 说明没有初始化，进行初始化
						newInstanceVO(obj, params[i]);
					}
					obj = attr_vo; // 变化当前操作对象
				}
				// 最后一级属性(注意split \\.可以用的是正则 而lastIndexOf不行，只能是.)
				lastAttr = attribute.substring(attribute.lastIndexOf(".") + 1);
				
			} else if (params.length == 2) {
				lastAttr = params[1];
			} else{
				return ; // 如果不到两个参数直接返回了
			}
			Class<?> fieldType = obj.getClass().getDeclaredField(lastAttr).getType();
			// 利用反射赋值
			Method method = obj.getClass().getDeclaredMethod("set" + MyStringUtils.initCap(lastAttr), fieldType);
			// 反射调用方法(这里传来的值都是字符串，需要转成相应的类型)
			method.invoke(obj, convertValue(fieldType, value));

		} catch (NoSuchFieldException | SecurityException | NoSuchMethodException | IllegalAccessException
				| IllegalArgumentException | InvocationTargetException e) {
			e.printStackTrace();
		}
	}

	/**
	 * @给类的属性对象初始化
	 * @param obj
	 * @param attribute
	 */
	private static void newInstanceVO(Object obj, String attribute) {

		try {
			Field field = obj.getClass().getDeclaredField(attribute);
			Object newInstance = field.getType().newInstance();
			// 然后调用set方法赋值
			Method method = obj.getClass().getDeclaredMethod("set" + MyStringUtils.initCap(attribute), field.getType());
			method.invoke(obj, newInstance);
		} catch (NoSuchFieldException | SecurityException | InstantiationException | IllegalAccessException
				| NoSuchMethodException | IllegalArgumentException | InvocationTargetException e) {
			e.printStackTrace();
		}

	}

	/**
	 * @字符串数据转换为对应的真实类型值
	 * @param type
	 * @param value
	 * @return
	 */
	private static Object convertValue(Class<?> type, String value) {

		String typeName = type.getSimpleName();
		switch (typeName) {

		case "int":
		case "Integer":
			return Integer.parseInt(value);
		case "double":
		case "Double":
			return Double.parseDouble(value);
		case "date":
		case "Date":
			// 判断格式返回相应的格式数据
			try {
				if (value.matches("\\d{4}-\\d{2}-\\d{2}")) {
					// 匹配年月日
					return new SimpleDateFormat("yyyy-MM-dd").parse(value);
				} else if (value.matches("\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}")) {
					return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(value);
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
			// 默认返回就是字符串
		default:
			return value;
		}

	}

}
